!define PRODUCT_NAME "Itch"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\itch.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\README.txt"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "English"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
; OutFile "itch-setup.exe" ;Should be specified on command line via /XOutFile <target>
InstallDir "$PROGRAMFILES\Itch"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show


Section "main" SEC01

	CreateDirectory "$INSTDIR"
	SetOutPath "$INSTDIR"
	File "build\itch.exe"
	File "LICENSE.txt"
	File "README.txt"
	
	CreateDirectory "$INSTDIR\example_batch_files"
	SetOutPath "$INSTDIR\example_batch_files"
	File "build\batch_files\*.bat"
	
	CreateDirectory "$SMPROGRAMS\Itch"
	CreateShortCut "$SMPROGRAMS\Itch\License.lnk" "$INSTDIR\LICENSE.txt"
	CreateShortCut "$SMPROGRAMS\Itch\Readme.lnk" "$INSTDIR\README.txt"
	CreateShortCut "$SMPROGRAMS\Itch\Sample Batch Files.lnk" "$INSTDIR\example_batch_files"
	
	Push $INSTDIR
	Call AddToPath
	
SectionEnd


Section -AdditionalIcons
	WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
	CreateShortCut "$SMPROGRAMS\Itch\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
	CreateShortCut "$SMPROGRAMS\Itch\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
	WriteUninstaller "$INSTDIR\uninst.exe"
	WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\itch.exe"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\itch.exe"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
	WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
	HideWindow
	MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."
FunctionEnd

Function un.onInit
	MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2
	Abort
FunctionEnd

Section Uninstall

	Push $INSTDIR
	Call un.RemoveFromPath

	Delete "$INSTDIR\${PRODUCT_NAME}.url"
	Delete "$INSTDIR\uninst.exe"
	Delete "$INSTDIR\README.txt"
	Delete "$INSTDIR\LICENSE.txt"
	Delete "$INSTDIR\itch.exe"
	Delete "$INSTDIR\example_batch_files\*.bat"

	Delete "$SMPROGRAMS\Itch\Uninstall.lnk"
	Delete "$SMPROGRAMS\Itch\Website.lnk"
	Delete "$SMPROGRAMS\Itch\Readme.lnk"
	Delete "$SMPROGRAMS\Itch\License.lnk"
	Delete "$SMPROGRAMS\Itch\Sample Batch Files.lnk"

	RMDir "$SMPROGRAMS\Itch"
	RMDir "$INSTDIR\example_batch_files"
	RMDir "$INSTDIR"

	DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
	DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
	SetAutoClose true
	
SectionEnd

!ifndef _AddToPath_nsh
!define _AddToPath_nsh
 
!verbose 3
!include "WinMessages.NSH"
!verbose 4
 
!ifndef WriteEnvStr_RegKey
	!ifdef ALL_USERS
		!define WriteEnvStr_RegKey \
			'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
	!else
		!define WriteEnvStr_RegKey 'HKCU "Environment"'
	!endif
!endif
 
; AddToPath - Adds the given dir to the search path.
;        Input - head of the stack
;        Note - Win9x systems requires reboot
 
Function AddToPath
	Exch $0
	Push $1
	Push $2
	Push $3
 
	; don't add if the path doesn't exist
	IfFileExists "$0\*.*" "" AddToPath_done
 
	ReadEnvStr $1 PATH
	Push "$1;"
	Push "$0;"
	Call StrStr
	Pop $2
	StrCmp $2 "" "" AddToPath_done
	Push "$1;"
	Push "$0\;"
	Call StrStr
	Pop $2
	StrCmp $2 "" "" AddToPath_done
	GetFullPathName /SHORT $3 $0
	Push "$1;"
	Push "$3;"
	Call StrStr
	Pop $2
	StrCmp $2 "" "" AddToPath_done
	Push "$1;"
	Push "$3\;"
	Call StrStr
	Pop $2
	StrCmp $2 "" "" AddToPath_done
 
	Call IsNT
	Pop $1
	StrCmp $1 1 AddToPath_NT
		; Not on NT
		StrCpy $1 $WINDIR 2
		FileOpen $1 "$1\autoexec.bat" a
		FileSeek $1 -1 END
		FileReadByte $1 $2
		IntCmp $2 26 0 +2 +2 ; DOS EOF
			FileSeek $1 -1 END ; write over EOF
		FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
		FileClose $1
		SetRebootFlag true
		Goto AddToPath_done
 
	AddToPath_NT:
		ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
		StrCmp $1 "" AddToPath_NTdoIt
			Push $1
			Call Trim
			Pop $1
			StrCpy $0 "$1;$0"
		AddToPath_NTdoIt:
			WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $0
			SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
 
	AddToPath_done:
		Pop $3
		Pop $2
		Pop $1
		Pop $0
FunctionEnd
 
; RemoveFromPath - Remove a given dir from the path
;     Input: head of the stack
 
Function un.RemoveFromPath
	Exch $0
	Push $1
	Push $2
	Push $3
	Push $4
	Push $5
	Push $6
 
	IntFmt $6 "%c" 26 ; DOS EOF
 
	Call un.IsNT
	Pop $1
	StrCmp $1 1 unRemoveFromPath_NT
		; Not on NT
		StrCpy $1 $WINDIR 2
		FileOpen $1 "$1\autoexec.bat" r
		GetTempFileName $4
		FileOpen $2 $4 w
		GetFullPathName /SHORT $0 $0
		StrCpy $0 "SET PATH=%PATH%;$0"
		Goto unRemoveFromPath_dosLoop
 
		unRemoveFromPath_dosLoop:
			FileRead $1 $3
			StrCpy $5 $3 1 -1 ; read last char
			StrCmp $5 $6 0 +2 ; if DOS EOF
				StrCpy $3 $3 -1 ; remove DOS EOF so we can compare
			StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
			StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
			StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
			StrCmp $3 "" unRemoveFromPath_dosLoopEnd
			FileWrite $2 $3
			Goto unRemoveFromPath_dosLoop
			unRemoveFromPath_dosLoopRemoveLine:
				SetRebootFlag true
				Goto unRemoveFromPath_dosLoop
 
		unRemoveFromPath_dosLoopEnd:
			FileClose $2
			FileClose $1
			StrCpy $1 $WINDIR 2
			Delete "$1\autoexec.bat"
			CopyFiles /SILENT $4 "$1\autoexec.bat"
			Delete $4
			Goto unRemoveFromPath_done
 
	unRemoveFromPath_NT:
		ReadRegStr $1 ${WriteEnvStr_RegKey} "PATH"
		StrCpy $5 $1 1 -1 ; copy last char
		StrCmp $5 ";" +2 ; if last char != ;
			StrCpy $1 "$1;" ; append ;
		Push $1
		Push "$0;"
		Call un.StrStr ; Find `$0;` in $1
		Pop $2 ; pos of our dir
		StrCmp $2 "" unRemoveFromPath_done
			; else, it is in path
			; $0 - path to add
			; $1 - path var
			StrLen $3 "$0;"
			StrLen $4 $2
			StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
			StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
			StrCpy $3 $5$6
 
			StrCpy $5 $3 1 -1 ; copy last char
			StrCmp $5 ";" 0 +2 ; if last char == ;
				StrCpy $3 $3 -1 ; remove last char
 
			WriteRegExpandStr ${WriteEnvStr_RegKey} "PATH" $3
			SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
 
	unRemoveFromPath_done:
		Pop $6
		Pop $5
		Pop $4
		Pop $3
		Pop $2
		Pop $1
		Pop $0
FunctionEnd
 
 
 
 
!ifndef IsNT_KiCHiK
!define IsNT_KiCHiK
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;            Utility Functions            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; IsNT
; no input
; output, top of the stack = 1 if NT or 0 if not
;
; Usage:
;   Call IsNT
;   Pop $R0
;  ($R0 at this point is 1 or 0)
 
!macro IsNT un
Function ${un}IsNT
	Push $0
	ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
	StrCmp $0 "" 0 IsNT_yes
	; we are not NT.
	Pop $0
	Push 0
	Return
 
	IsNT_yes:
		; NT!!!
		Pop $0
		Push 1
FunctionEnd
!macroend
!insertmacro IsNT ""
!insertmacro IsNT "un."
 
!endif ; IsNT_KiCHiK
 
; StrStr
; input, top of stack = string to search for
;        top of stack-1 = string to search in
; output, top of stack (replaces with the portion of the string remaining)
; modifies no other variables.
;
; Usage:
;   Push "this is a long ass string"
;   Push "ass"
;   Call StrStr
;   Pop $R0
;  ($R0 at this point is "ass string")
 
!macro StrStr un
Function ${un}StrStr
Exch $R1 ; st=haystack,old$R1, $R1=needle
	Exch    ; st=old$R1,haystack
	Exch $R2 ; st=old$R1,old$R2, $R2=haystack
	Push $R3
	Push $R4
	Push $R5
	StrLen $R3 $R1
	StrCpy $R4 0
	; $R1=needle
	; $R2=haystack
	; $R3=len(needle)
	; $R4=cnt
	; $R5=tmp
	loop:
		StrCpy $R5 $R2 $R3 $R4
		StrCmp $R5 $R1 done
		StrCmp $R5 "" done
		IntOp $R4 $R4 + 1
		Goto loop
done:
	StrCpy $R1 $R2 "" $R4
	Pop $R5
	Pop $R4
	Pop $R3
	Pop $R2
	Exch $R1
FunctionEnd
!macroend
!insertmacro StrStr ""
!insertmacro StrStr "un."
 
!endif ; _AddToPath_nsh
 
Function Trim ; Added by Pelaca
	Exch $R1
	Push $R2
Loop:
	StrCpy $R2 "$R1" 1 -1
	StrCmp "$R2" " " RTrim
	StrCmp "$R2" "$\n" RTrim
	StrCmp "$R2" "$\r" RTrim
	StrCmp "$R2" ";" RTrim
	GoTo Done
RTrim:	
	StrCpy $R1 "$R1" -1
	Goto Loop
Done:
	Pop $R2
	Exch $R1
FunctionEnd